#include <stdio.h>

#define DIM 5 // 定义矩阵维度

// 对称矩阵压缩
// i,j下标都是从零开始
int main()
{
    int matrix[DIM][DIM] =
        {
            {1, 2, 3, 4, 5},
            {2, 2, 1, 3, 2},
            {3, 1, 5, 3, 1},
            {4, 3, 3, 2, 3},
            {5, 2, 1, 3, 7}}; // 构建一个对称矩阵
    int k = (DIM) * (DIM + 1) / 2;
    int data[k];
    for (int i = 0; i < DIM; i++) // 上三角的存储方式
    {
        for (int j = i; j < DIM; j++)
        {
            int num = j * (j + 1) / 2 + i;
            data[num] = matrix[i][j];
        }
    }
    printf("输出压缩的矩阵:\n");
    // 输出压缩后的矩阵
    for (int i = 0; i < k; i++)
    {
        printf("%d ", data[i]);
    }

    // 对矩阵还原
    int new_matrix[DIM][DIM];
    for (int i = 0; i < DIM; i++)
    {
        for (int j = 0; j < DIM; j++)
        {
            if (i >= j)
            {
                int num = i * (i + 1) / 2 + j;
                new_matrix[i][j] = data[num];
            }
            else
            {
                int num = j * (j + 1) / 2 + i;
                new_matrix[i][j] = data[num];
            }
        }
    }
    printf("\n输出还原的矩阵:\n");
    for (int i = 0; i < DIM; i++)
    {
        for (int j = 0; j < DIM; j++)
        {
            printf("%d ", new_matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}
